package com.sd365.permission.centre.service;

import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.RoleCompanyDTO;
import com.sd365.permission.centre.pojo.dto.RoleDTO;
import com.sd365.permission.centre.pojo.dto.RoleResourceDTO;
import com.sd365.permission.centre.pojo.dto.UserRoleDTO;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.RoleCompanyVO;
import com.sd365.permission.centre.pojo.vo.RoleVO;
import com.sd365.permission.centre.pojo.vo.UserVO;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;

/**
 * @Class RoleService
 * @Description 优化代码和修复bug
 * @Author Administrator
 * @Date 2022-9-30  14:48
 * @version 1.0.0
 */
@CacheConfig(cacheNames = "RoleService")
public interface RoleService {
    /**
     * 状态
     */
    byte INITIALIZE_STATUS_VALUE=1;
    /**
     *版本
     */
    long INITIALIZE_VERSION_VALUE=1;
    /**
     *初始化角色和资源的关系，不同的角色初始化不同的资源到内存
     * @author shi xusheng
     * @date 2022/12/23 14:32
     * @param role
     * @return java.lang.Boolean
     */
    Boolean initRoleResourceRedis(Role role);
    /**
     *为角色分配资源，可以多对多，多个角色分配多个资源
     * 异常："roleResourceDTO不能为null"；roleResourceDTO的RoleIds不能为空
     * @author shi xusheng
     * @date 2022/12/23 19:36
     * @param roleResourceDTO
     * @return Boolean ，true：分配资源成功，false：资源分配失败
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean assignResource(RoleResourceDTO roleResourceDTO);
    /**
     * @Description: 为角色分配用户，删除原来的 分配新的
     * 异常：userRoleDTO不能为null";userRoleDTOd的RoleIds属性不能为空
     * @Author: 史旭升
     * @DATE: 2022-12-23  15:51
     * @param:  当前勾选的用户以及从用户查询对话框多选的用户
     * @return: Boolean  true分配用户成功， false分配失败
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean assignUser(UserRoleDTO userRoleDTO);

    /**
     *查看角色的通过角色id获取该角色拥有的资源,角色界面未发起对该方法考虑非在角色管理模块
     *  使用，所以培训项目不要求实现改方法 请忽略该方法的实现
     * @author shi xusheng
     * @date 2022/12/24 00:31
     * @param roleId
     * @return java.util.List<com.sd365.permission.centre.entity.Node>
     */
    List<Node> queryResourceByRoleId(long roleId);

    /**
     * 通过角色id获取该角色得公司名
     * @author shi xusheng
     * @date 2022/12/24 00:31
     * @param
     * @return Node
     */
    List<Node> selectCompany();

    /**
     * 验证角色是否重复
     * 异常：roleDTO不能为null
     * @author shi xusheng
     * @date 2022/12/25 10:32
     * @param roleDTO 角色名
     * @return Node
     */
    boolean haveRole(@RequestBody @Valid RoleDTO roleDTO);

    /**
     *增加角色，复制也是调用该方法
     * 异常：roleDTO不能为null
     * @author shi xusheng
     * @date 2022/12/26 12:07
     * @param roleDTO
     * @return java.lang.Boolean
     */
    Boolean add(@RequestBody @Valid RoleDTO roleDTO);


    /**
     *删除角色，要删除和角色关联的表的所有相关数据
     * 异常：id不能为null
     * @author shi xusheng
     * @date 2022/12/26 12:08
     * @param id
     * @param version
     * @return java.lang.Boolean
     */
    Boolean remove(Long id, Long version);


    /**
     *修改角色信息
     * 异常：roleDTO不能为null，roleDTO的code和name字段不能为null
     * @author shi xusheng
     * @date 2022/12/27 00:32
     * @param roleDTO
     * @return boolean true 修改角色信息成功 ，false失败
     */
   boolean modify(RoleDTO roleDTO);

    /**
     *分页查询
     * 异常：参数roleQuery不能为null
     * @author shi xusheng
     * @date 2022/12/26 10:12
     * @param roleQuery
     * @return java.util.List<com.sd365.permission.centre.pojo.dto.RoleDTO>
     */
    List<RoleDTO> commonQuery(RoleQuery roleQuery);

    /**
     *通过id查询
     * 异常：参数id不能为null
     * @author shi xusheng
     * @date 2022/12/26 17:06
     * @param id
     * @return com.sd365.permission.centre.pojo.dto.RoleDTO
     */
    RoleVO queryById(Long id);

    /**
     * @Description: 执行数据的查询然后在展示在拷贝对话框
     * 异常：id参数不能为null
     * @Author: shixusheng
     * @DATE: 2022-12-26  16:32
     * @return: RoleDTO
     */
    RoleDTO copy(Long id);
    /**
     * @Description: 批量删除角色，要删除和角色关联的表的所有相关数据
     * 异常：参数roleDTOS数组不为空，roleDTO的id字段不能为null
     * @Author: shi xusheng
     * @DATE: 2022-12-26  13:24
     * @param: roleDTOS
     * @return: Boolean true删除成功 false删除失败
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean batchRemove(RoleDTO[] roleDTOS);

    /**
     *角色管理模块 分配用户时的用户查询
     * 异常：参数userQuery不能为null
     * @author shi xusheng
     * @date 2022/12/26 11:04
     * @param userQuery
     * @return java.util.List<com.sd365.permission.centre.pojo.dto.UserDTO>
     */
    List<UserVO> commonQueryUser(UserQuery userQuery);
    /**
     * @Description: 查询用户资源 BY ID（资源分配时展示）
     * 异常：参数id不能为null
     * @Author: 史旭升
     * @DATE: 2022-12-26  19:17
     * @param: 用户id
     * @return: 用户对象的角色
     */
    RoleDTO queryUserResource(Long id);

    /**
     * @Description: 通过id查询角色公司关系，培训项目不要求实现功能点
     * @Author: 史旭升
     * @date 2022-12-26
     * @param id
     * @return RoleCompanyVO
     */
    RoleCompanyVO queryRoleCompanyById(Long id);

    /**
     * @Description:修改角色公司关系 培训项目不要求实现功能点
     * @Author: 史旭升
     * @date 2022-12-26
     * @param roleCompanyDTO
     * @return Boolean
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean modifyRoleCompany(RoleCompanyDTO roleCompanyDTO);

    /**
     * @Description:queryUserResource()方法抽取出来的代码
     * 用于控制层对象转换
     * @Author: 史旭升
     * @date 2022-12-26
     * @param roleDTO
     * @return RoleVO
     */
    RoleVO getCopyRoleVO(RoleDTO roleDTO);

}
